package main

import (
	"fmt"
	"sync"
	"time"
)

/*
sync.Once,仅会被调用一次
*/
func main() {
	for i := 0; i < 100; i++ {
		go func() {
			//icon_unsafe("spades.png")
			icon2("spades.png")
		}()
	}

	// 主goroutine等待一段时间后读取计数器的值
	time.Sleep(1 * time.Second)
}

var icons map[string]string

func loadIcons() {
	mm := make(map[string]string)
	mm["spades.png"] = "/spades.png"
	mm["hearts.png"] = "/hearts.png"
	mm["diamonds.png"] = "/diamonds.png"
	mm["clubs.png"] = "/clubs.png"
	icons = mm
	fmt.Println("初始化map")
}

// NOTE: 并发不安全
func icon_unsafe(name string) string {
	if icons == nil {
		// 可能会被初始化多次
		loadIcons()
	}
	return icons[name]
}

var icons2 map[string]string
var loadIconsOnce sync.Once

// NOTE: 并发安全
func icon2(name string) string {
	// 使用Once，仅会被调用一次
	loadIconsOnce.Do(loadIcons)
	return icons[name]
}
